#ifndef _KEYBOARD_H
#define _KEYBOARD_H

#include "queue.h"


#define MAX_SCANCODES 100

/* Constantes para representacion de teclas especiales */
#define KEY_NULL 	-1
#define KEY_LEFT 	-2
#define KEY_RIGHT	-3
#define KEY_HOME 	-4
#define KEY_END 	-5
#define KEY_DELETE 	-6
#define KEY_ESC		-7
#define KEY_UP		-8
#define KEY_DOWN	-9

/* Constantes para representacion de teclas modificadoras */
#define KEY_LSHIFT	1
#define KEY_RSHIFT	2
#define KEY_LCTRL	4
#define KEY_RCTRL	8
#define KEY_LALT	16
#define KEY_RALT	32
#define KEY_CAPS	64
#define KEY_NUM		128
#define KEY_SCR		256

/*
 * Tipo de datos: keyboardT
 * ------------------------
 * Estructura para el manejo de un teclado de una terminal.
 */
typedef struct {
	unsigned char scancode_array[MAX_SCANCODES]; /* Arreglo para la cola */
	queueT scancodes;	/* Buffer del teclado */
	int modifiers;		/* Teclas modificadoras activas */
} keyboardT;

/*
 * Tipo de datos: keyT
 * -------------------
 * Contiene los datos de una tecla presionada.
 */
typedef struct {
	int value;  /* Si es >= 0 es el ascii, si es < 0 una tecla especial. */
	int modifiers; /* Teclas modificadoras */
} keyT;



/*
 * Funcion: handle_scancode
 * ------------------------
 * Cada vez que llega una interrupcion de teclado, se debe invocar a esta
 * funcion pasandole el scancode correspondiente.  Retorna en su nombre
 * -1 si no hay que cambiar de terminal, o el numero de terminal
 * a la que hay que cambiar.
 */
int handle_scancode(unsigned char scancode);

/*
 * Funcion: get_key
 * ----------------
 * Desencola scancodes del buffer de teclado hasta sacar un caracter
 * imprimible o vaciarla. Procesa los make codes y las teclas modificadoras
 * internamente y devuelve la tecla ingresada en un keyT.
 */
keyT get_key(void);

/*
 * Funcion: setLights
 * ----------------
 * Maneja las luces del teclado (num block, caps lock, scr lock)
 */
void setLights(int modifiers);

#endif
